GdkMonitor
gdk_monitor_get_display
gdk_monitor_get_geometry
-gdk_monitor_get_workarea
gdk_monitor_get_width_mm
gdk_monitor_get_height_mm
gdk_monitor_get_manufacturer
int height,
GdkPopupLayout *layout)
{
+ GdkMonitor *monitor;
+ GdkRectangle bounds;
GdkRectangle final_rect;
int x, y;
+ monitor = gdk_surface_get_layout_monitor (surface, layout,
+ gdk_monitor_get_geometry);
+ gdk_monitor_get_geometry (monitor, &bounds);
+
gdk_surface_layout_popup_helper (surface,
width,
height,
+ monitor,
+ &bounds,
layout,
&final_rect);
PROP_CONNECTOR,
PROP_SCALE_FACTOR,
PROP_GEOMETRY,
- PROP_WORKAREA,
PROP_WIDTH_MM,
PROP_HEIGHT_MM,
PROP_REFRESH_RATE,
g_value_set_boxed (value, &monitor->geometry);
break;
- case PROP_WORKAREA:
- {
- GdkRectangle workarea;
- gdk_monitor_get_workarea (monitor, &workarea);
- g_value_set_boxed (value, &workarea);
- }
- break;
-
case PROP_WIDTH_MM:
g_value_set_int (value, monitor->width_mm);
break;
"The geometry of the monitor",
GDK_TYPE_RECTANGLE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
- props[PROP_WORKAREA] =
- g_param_spec_boxed ("workarea",
- "Workarea",
- "The workarea of the monitor",
- GDK_TYPE_RECTANGLE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
props[PROP_WIDTH_MM] =
g_param_spec_int ("width-mm",
"Physical width",
*geometry = monitor->geometry;
}
-/**
- * gdk_monitor_get_workarea:
- * @monitor: a #GdkMonitor
- * @workarea: (out): a #GdkRectangle to be filled with
- * the monitor workarea
- *
- * Retrieves the size and position of the “work area” on a monitor
- * within the display coordinate space. The returned geometry is in
- * ”application pixels”, not in ”device pixels” (see
- * gdk_monitor_get_scale_factor()).
- *
- * The work area should be considered when positioning menus and
- * similar popups, to avoid placing them below panels, docks or other
- * desktop components.
- *
- * Note that not all backends may have a concept of workarea. This
- * function will return the monitor geometry if a workarea is not
- * available, or does not apply.
- */
-void
-gdk_monitor_get_workarea (GdkMonitor *monitor,
- GdkRectangle *workarea)
-{
- g_return_if_fail (GDK_IS_MONITOR (monitor));
- g_return_if_fail (workarea != NULL);
-
- if (GDK_MONITOR_GET_CLASS (monitor)->get_workarea)
- GDK_MONITOR_GET_CLASS (monitor)->get_workarea (monitor, workarea);
- else
- *workarea = monitor->geometry;
-}
-
/**
* gdk_monitor_get_width_mm:
* @monitor: a #GdkMonitor
void gdk_monitor_get_geometry (GdkMonitor *monitor,
GdkRectangle *geometry);
GDK_AVAILABLE_IN_ALL
-void gdk_monitor_get_workarea (GdkMonitor *monitor,
- GdkRectangle *workarea);
-GDK_AVAILABLE_IN_ALL
int gdk_monitor_get_width_mm (GdkMonitor *monitor);
GDK_AVAILABLE_IN_ALL
int gdk_monitor_get_height_mm (GdkMonitor *monitor);
struct _GdkMonitorClass {
GObjectClass parent_class;
-
- void (* get_workarea) (GdkMonitor *monitor,
- GdkRectangle *geometry);
};
GdkMonitor * gdk_monitor_new (GdkDisplay *display);
}
static GdkMonitor *
-get_monitor_for_rect (GdkDisplay *display,
- const GdkRectangle *rect)
+get_monitor_for_rect (GdkDisplay *display,
+ const GdkRectangle *rect,
+ void (*get_bounds) (GdkMonitor *monitor,
+ GdkRectangle *bounds))
{
int biggest_area = G_MININT;
GdkMonitor *best_monitor = NULL;
for (i = 0; i < g_list_model_get_n_items (monitors); i++)
{
monitor = g_list_model_get_item (monitors, i);
- gdk_monitor_get_workarea (monitor, &workarea);
+ get_bounds (monitor, &workarea);
if (gdk_rectangle_intersect (&workarea, rect, &intersection))
{
return primary;
}
+GdkMonitor *
+gdk_surface_get_layout_monitor (GdkSurface *surface,
+ GdkPopupLayout *layout,
+ void (*get_bounds) (GdkMonitor *monitor,
+ GdkRectangle *bounds))
+{
+ GdkDisplay *display;
+ GdkRectangle root_rect;
+
+ root_rect = *gdk_popup_layout_get_anchor_rect (layout);
+ gdk_surface_get_root_coords (surface->parent,
+ root_rect.x,
+ root_rect.y,
+ &root_rect.x,
+ &root_rect.y);
+
+ display = get_display_for_surface (surface, surface->transient_for);
+ return get_monitor_for_rect (display, &root_rect, get_bounds);
+}
+
void
gdk_surface_layout_popup_helper (GdkSurface *surface,
int width,
int height,
+ GdkMonitor *monitor,
+ GdkRectangle *bounds,
GdkPopupLayout *layout,
GdkRectangle *out_final_rect)
{
- GdkDisplay *display;
- GdkMonitor *monitor;
- GdkRectangle bounds;
GdkRectangle root_rect;
GdkGravity rect_anchor;
GdkGravity surface_anchor;
&root_rect.x,
&root_rect.y);
- display = get_display_for_surface (surface, surface->transient_for);
- monitor = get_monitor_for_rect (display, &root_rect);
- gdk_monitor_get_workarea (monitor, &bounds);
-
rect_anchor = gdk_popup_layout_get_rect_anchor (layout);
surface_anchor = gdk_popup_layout_get_surface_anchor (layout);
gdk_popup_layout_get_offset (layout, &rect_anchor_dx, &rect_anchor_dy);
final_rect.width = width - surface->shadow_left - surface->shadow_right;
final_rect.height = height - surface->shadow_top - surface->shadow_bottom;
- final_rect.x = maybe_flip_position (bounds.x,
- bounds.width,
+ final_rect.x = maybe_flip_position (bounds->x,
+ bounds->width,
root_rect.x,
root_rect.width,
final_rect.width,
rect_anchor_dx,
anchor_hints & GDK_ANCHOR_FLIP_X,
&flipped_x);
- final_rect.y = maybe_flip_position (bounds.y,
- bounds.height,
+ final_rect.y = maybe_flip_position (bounds->y,
+ bounds->height,
root_rect.y,
root_rect.height,
final_rect.height,
if (anchor_hints & GDK_ANCHOR_SLIDE_X)
{
- if (final_rect.x + final_rect.width > bounds.x + bounds.width)
- final_rect.x = bounds.x + bounds.width - final_rect.width;
+ if (final_rect.x + final_rect.width > bounds->x + bounds->width)
+ final_rect.x = bounds->x + bounds->width - final_rect.width;
- if (final_rect.x < bounds.x)
- final_rect.x = bounds.x;
+ if (final_rect.x < bounds->x)
+ final_rect.x = bounds->x;
}
if (anchor_hints & GDK_ANCHOR_SLIDE_Y)
{
- if (final_rect.y + final_rect.height > bounds.y + bounds.height)
- final_rect.y = bounds.y + bounds.height - final_rect.height;
+ if (final_rect.y + final_rect.height > bounds->y + bounds->height)
+ final_rect.y = bounds->y + bounds->height - final_rect.height;
- if (final_rect.y < bounds.y)
- final_rect.y = bounds.y;
+ if (final_rect.y < bounds->y)
+ final_rect.y = bounds->y;
}
if (anchor_hints & GDK_ANCHOR_RESIZE_X)
{
- if (final_rect.x < bounds.x)
+ if (final_rect.x < bounds->x)
{
- final_rect.width -= bounds.x - final_rect.x;
- final_rect.x = bounds.x;
+ final_rect.width -= bounds->x - final_rect.x;
+ final_rect.x = bounds->x;
}
- if (final_rect.x + final_rect.width > bounds.x + bounds.width)
- final_rect.width = bounds.x + bounds.width - final_rect.x;
+ if (final_rect.x + final_rect.width > bounds->x + bounds->width)
+ final_rect.width = bounds->x + bounds->width - final_rect.x;
}
if (anchor_hints & GDK_ANCHOR_RESIZE_Y)
{
- if (final_rect.y < bounds.y)
+ if (final_rect.y < bounds->y)
{
- final_rect.height -= bounds.y - final_rect.y;
- final_rect.y = bounds.y;
+ final_rect.height -= bounds->y - final_rect.y;
+ final_rect.y = bounds->y;
}
- if (final_rect.y + final_rect.height > bounds.y + bounds.height)
- final_rect.height = bounds.y + bounds.height - final_rect.y;
+ if (final_rect.y + final_rect.height > bounds->y + bounds->height)
+ final_rect.height = bounds->y + bounds->height - final_rect.y;
}
final_rect.x -= surface->shadow_left;
void gdk_surface_set_state (GdkSurface *surface,
GdkSurfaceState new_state);
+GdkMonitor * gdk_surface_get_layout_monitor (GdkSurface *surface,
+ GdkPopupLayout *layout,
+ void (*get_bounds) (GdkMonitor *monitor,
+ GdkRectangle *bounds));
+
void gdk_surface_layout_popup_helper (GdkSurface *surface,
int width,
int height,
+ GdkMonitor *monitor,
+ GdkRectangle *bounds,
GdkPopupLayout *layout,
GdkRectangle *out_final_rect);
monitor = _gdk_macos_display_get_monitor_at_display_coords ([self gdkDisplay],
currentLocation.x,
currentLocation.y);
- gdk_monitor_get_geometry (monitor, &geometry);
- gdk_monitor_get_workarea (monitor, &workarea);
+ gdk_macos_monitor_get_geometry (monitor, &geometry);
+ gdk_macos_monitor_get_workarea (monitor, &workarea);
_edge_snapping_set_monitor (&self->snapping, &geometry, &workarea);
/* Convert origins to GDK coordinates */
monitor = _gdk_macos_surface_get_best_monitor ([self gdkSurface]);
gdk_monitor_get_geometry (monitor, &geometry);
- gdk_monitor_get_workarea (monitor, &workarea);
+ gdk_macos_monitor_get_workarea (monitor, &workarea);
initialMoveLocation = [NSEvent mouseLocation];
G_DEFINE_TYPE (GdkMacosMonitor, gdk_macos_monitor, GDK_TYPE_MONITOR)
-static void
+/**
+ * gdk_macos_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ * the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
gdk_macos_monitor_get_workarea (GdkMonitor *monitor,
GdkRectangle *geometry)
{
static void
gdk_macos_monitor_class_init (GdkMacosMonitorClass *klass)
{
- GdkMonitorClass *monitor_class = GDK_MONITOR_CLASS (klass);
-
- monitor_class->get_workarea = gdk_macos_monitor_get_workarea;
}
static void
GDK_AVAILABLE_IN_ALL
GType gdk_macos_monitor_get_type (void);
+void gdk_macos_monitor_get_workarea (GdkMonitor *monitor,
+ GdkRectangle *geometry);
+
G_END_DECLS
#endif /* __GDK_MACOS_MONITOR_H__ */
int height,
GdkPopupLayout *layout)
{
+ GdkMonitor *monitor;
+ GdkRectangle bounds;
GdkRectangle final_rect;
int x, y;
self->layout = gdk_popup_layout_ref (layout);
}
+ monitor = gdk_surface_get_layout_monitor (surface, layout,
+ gdk_macos_monitor_get_workarea);
+ gdk_macos_monitor_get_workarea (monitor, &bounds);
+
gdk_surface_layout_popup_helper (GDK_SURFACE (self),
width,
height,
+ monitor,
+ &bounds,
layout,
&final_rect);
{
GdkRectangle visible;
- gdk_monitor_get_workarea (monitor, &visible);
+ gdk_macos_monitor_get_workarea (monitor, &visible);
if (x < visible.x)
x = visible.x;
primary_to_move = w32_ex_monitor;
gdk_monitor_get_geometry (m, &geometry);
- gdk_monitor_get_workarea (m, &workarea);
- gdk_monitor_get_workarea (ex_monitor, &ex_workarea);
+ gdk_win32_monitor_get_workarea (m, &workarea);
+ gdk_win32_monitor_get_workarea (ex_monitor, &ex_workarea);
if (memcmp (&workarea, &ex_workarea, sizeof (GdkRectangle)) != 0)
{
return a == b ? 0 : a < b ? -1 : 1;
}
-static void
+/**
+ * gdk_win32_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ * the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
gdk_win32_monitor_get_workarea (GdkMonitor *monitor,
GdkRectangle *dest)
{
gdk_win32_monitor_class_init (GdkWin32MonitorClass *class)
{
G_OBJECT_CLASS (class)->finalize = gdk_win32_monitor_finalize;
-
- GDK_MONITOR_CLASS (class)->get_workarea = gdk_win32_monitor_get_workarea;
}
int height,
GdkPopupLayout *layout)
{
+ GdkMonitor *monitor;
+ GdkRectangle bounds;
GdkRectangle final_rect;
int x, y;
+ monitor = gdk_surface_get_layout_monitor (surface, layout,
+ gdk_win32_monitor_get_workarea);
+ gdk_win32_monitor_get_workarea (monitor, &bounds);
+
gdk_surface_layout_popup_helper (surface,
width,
height,
+ monitor,
+ &bounds,
layout,
&final_rect);
monitor = g_list_model_get_item (monitors, monitor_idx);
g_object_unref (monitors);
- gdk_monitor_get_workarea (monitor, &wa);
+ gdk_win32_monitor_get_workarea (monitor, &wa);
gdk_monitor_get_geometry (monitor, &geometry);
for (other_monitor_idx = 0;
other_monitor = g_list_model_get_item (monitors, other_monitor_idx);
g_object_unref (other_monitor);
- gdk_monitor_get_workarea (other_monitor, &other_wa);
+ gdk_win32_monitor_get_workarea (other_monitor, &other_wa);
/* An edge triggers AeroSnap only if there are no
* monitors beyond that edge.
if (impl->snap_stash == NULL)
return;
- gdk_monitor_get_workarea (monitor, &rect);
+ gdk_win32_monitor_get_workarea (monitor, &rect);
GDK_NOTE (MISC, g_print ("Monitor work area %d x %d @ %d : %d\n", rect.width, rect.height, rect.x, rect.y));
impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFLEFT;
- gdk_monitor_get_workarea (snap_monitor, &rect);
+ gdk_win32_monitor_get_workarea (snap_monitor, &rect);
stash_window (window, impl);
impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFRIGHT;
- gdk_monitor_get_workarea (snap_monitor, &rect);
+ gdk_win32_monitor_get_workarea (snap_monitor, &rect);
stash_window (window, impl);
display = gdk_surface_get_display (window);
monitor = get_monitor_at_point (display, x, y);
- gdk_monitor_get_workarea (monitor, &workarea);
+ gdk_win32_monitor_get_workarea (monitor, &workarea);
maxysize = GetSystemMetrics (SM_CYVIRTUALSCREEN) / impl->surface_scale;
start_size.x = start_size.y = 0;
GDK_AVAILABLE_IN_ALL
GType gdk_win32_monitor_get_type (void) G_GNUC_CONST;
+void gdk_win32_monitor_get_workarea (GdkMonitor *monitor,
+ GdkRectangle *workarea);
+
G_END_DECLS
#endif /* __GDK_WIN32_MONITOR_H__ */
return has_fullscreen;
}
-static void
+/**
+ * gdk_x11_monitor_get_workarea:
+ * @monitor: a #GdkMonitor
+ * @workarea: (out): a #GdkRectangle to be filled with
+ * the monitor workarea
+ *
+ * Retrieves the size and position of the “work area” on a monitor
+ * within the display coordinate space. The returned geometry is in
+ * ”application pixels”, not in ”device pixels” (see
+ * gdk_monitor_get_scale_factor()).
+ */
+void
gdk_x11_monitor_get_workarea (GdkMonitor *monitor,
GdkRectangle *dest)
{
static void
gdk_x11_monitor_class_init (GdkX11MonitorClass *class)
{
- GDK_MONITOR_CLASS (class)->get_workarea = gdk_x11_monitor_get_workarea;
}
XID
newgeo.height = rr_monitors[i].height / x11_screen->surface_scale;
gdk_monitor_set_geometry (GDK_MONITOR (monitor), &newgeo);
- g_object_notify (G_OBJECT (monitor), "workarea");
gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
rr_monitors[i].mwidth,
rr_monitors[i].mheight);
newgeo.height = crtc->height / x11_screen->surface_scale;
gdk_monitor_set_geometry (GDK_MONITOR (monitor), &newgeo);
- g_object_notify (G_OBJECT (monitor), "workarea");
gdk_monitor_set_physical_size (GDK_MONITOR (monitor),
output_info->mm_width,
output_info->mm_height);
height = HeightOfScreen (x11_screen->xscreen);
gdk_monitor_set_geometry (GDK_MONITOR (monitor), &(GdkRectangle) { 0, 0, width, height });
- g_object_notify (G_OBJECT (monitor), "workarea");
gdk_monitor_set_physical_size (GDK_MONITOR (monitor), width_mm, height_mm);
gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), x11_screen->surface_scale);
int height,
GdkPopupLayout *layout)
{
+ GdkMonitor *monitor;
+ GdkRectangle bounds;
GdkRectangle final_rect;
int x, y;
+ monitor = gdk_surface_get_layout_monitor (surface, layout,
+ gdk_x11_monitor_get_workarea);
+ gdk_x11_monitor_get_workarea (monitor, &bounds);
+
gdk_surface_layout_popup_helper (surface,
width,
height,
+ monitor,
+ &bounds,
layout,
&final_rect);
GDK_AVAILABLE_IN_ALL
XID gdk_x11_monitor_get_output (GdkMonitor *monitor);
+GDK_AVAILABLE_IN_ALL
+void gdk_x11_monitor_get_workarea (GdkMonitor *monitor,
+ GdkRectangle *workarea);
+
G_END_DECLS
#endif /* __GDK_X11_MONITOR_H__ */
GdkSurface *surface;
GdkDisplay *display;
GdkMonitor *monitor;
- GdkRectangle workarea;
+ GdkRectangle geometry;
int minimum, natural;
widget = GTK_WIDGET (window);
if (surface)
{
monitor = gdk_display_get_monitor_at_surface (display, surface);
- gdk_monitor_get_workarea (monitor, &workarea);
+ gdk_monitor_get_geometry (monitor, &geometry);
}
else
{
monitor = g_list_model_get_item (gdk_display_get_monitors (display), 0);
if (monitor)
{
- gdk_monitor_get_workarea (monitor, &workarea);
+ gdk_monitor_get_geometry (monitor, &geometry);
g_object_unref (monitor);
}
else
{
- workarea.width = G_MAXINT;
- workarea.height = G_MAXINT;
+ geometry.width = G_MAXINT;
+ geometry.height = G_MAXINT;
}
}
- *width = workarea.width;
- *height = workarea.height;
+ *width = geometry.width;
+ *height = geometry.height;
if (gtk_widget_get_request_mode (widget) == GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT)
{
continue;
if (g_type_is_a (type, GDK_TYPE_MONITOR) &&
- (strcmp (pspec->name, "geometry") == 0 ||
- strcmp (pspec->name, "workarea") == 0))
+ (strcmp (pspec->name, "geometry") == 0))
continue;
if (g_type_is_a (type, GTK_TYPE_ABOUT_DIALOG) &&